package com.changgou.entity;


import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import java.util.Enumeration;

/**
 * *从数据库加载查询用户信息
 * * 1:没有令牌，Feign调用之前，生成令牌(admin)
 * * 2:Feign调用之前，令牌需要携带过去
 * * 3:Feign调用之前，令牌需要存放到Header文件中
 * * 4:请求->Feign调用->拦截器Request Interceptor->Feign调用之前执行拦截
 */

public class FeignRequestInterceptor implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate requestTemplate) {
        //记录了当前用户请求的所有数据，包含请求头和请求参数等
        //用户当前请求的时候对应线程的数据, 默认是线程池隔离，会开启新的线程，需要将熔断策略换成信号量隔离，此时不会开启新的线程
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        /***
         *获取请求头中的数据
         *获取所有头的名字.
         */
        Enumeration<String> headerNames = requestAttributes.getRequest().getHeaderNames();
        while (headerNames.hasMoreElements()) {
            String headerkey = headerNames.nextElement();
            String headerValue = requestAttributes.getRequest().getHeader(headerkey);
            System.out.println(headerkey+""+headerValue);
            //将请求头信息封装到头中，使用Feign调用的时候， 会传递给下一个微服务
            requestTemplate.header(headerkey,headerValue);
        }
    }
}
